package com.example.myapplicationktkt2.adapter

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.example.myapplicationktkt2.R
import com.example.myapplicationktkt2.model.Person

/**
 * PersonListAdapter是用于在ListView中显示Person对象的自定义适配器
 *
 * @property context 上下文
 * @property persons Person对象列表
 * @author Example
 * @since 1.0
 */
class PersonListAdapter(
    private val context: Context,
    private val persons: List<Person>
) : BaseAdapter() {

    /**
     * 获取数据项数量
     *
     * @return 数据项数量
     */
    override fun getCount(): Int {
        return persons.size
    }

    /**
     * 获取指定位置的数据项
     *
     * @param position 位置索引
     * @return 指定位置的Person对象
     */
    override fun getItem(position: Int): Person {
        return persons[position]
    }

    /**
     * 获取指定位置的ItemId
     *
     * @param position 位置索引
     * @return 指定位置的ItemId
     */
    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    /**
     * ViewHolder类，用于持有列表项中的视图组件
     *
     * @property avatarImageView 头像ImageView
     * @property nameTextView 姓名TextView
     * @property ageTextView 年龄TextView
     * @property emailTextView 邮箱TextView
     */
    class ViewHolder(
        val avatarImageView: ImageView,
        val nameTextView: TextView,
        val ageTextView: TextView,
        val emailTextView: TextView
    )

    /**
     * 获取指定位置的视图
     *
     * 添加了ViewHolder内部类：
     * 创建了ViewHolder类来持有列表项中的所有视图组件
     * ViewHolder包含对avatarImageView、nameTextView、ageTextView和emailTextView的引用
     * 实现视图重用机制：
     * 在getView方法中检查convertView是否为null
     * 如果为null，则创建新视图并初始化ViewHolder
     * 如果不为null，则重用现有视图和ViewHolder
     * 性能优化：
     * 通过ViewHolder避免了每次滚动时重复调用findViewById
     * 提高了ListView的滚动性能，特别是在列表项较复杂或数据量较大时
     * @param position 位置索引
     * @param convertView 重用的视图
     * @param parent 父容器
     * @return 指定位置的视图
     */
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view: View
        val holder: ViewHolder

        if (convertView == null) {
            // 创建新视图
            view = LayoutInflater.from(context).inflate(R.layout.item_person, parent, false)

            // 初始化ViewHolder
            holder = ViewHolder(
                view.findViewById(R.id.imageViewAvatar),
                view.findViewById(R.id.textViewName),
                view.findViewById(R.id.textViewAge),
                view.findViewById(R.id.textViewEmail)
            )

            // 将ViewHolder存储在视图的tag中
            view.tag = holder
        } else {
            // 重用已存在的视图
            view = convertView
            holder = view.tag as ViewHolder
        }

        val person = getItem(position)

        // 使用ViewHolder设置数据
        holder.avatarImageView.setImageResource(person.avatarResource)
        holder.nameTextView.text = person.name
        holder.ageTextView.text = "年龄: ${person.age}"
        holder.emailTextView.text = "邮箱: ${person.email}"

        return view
    }
}